<html>
    <head>
        <title>定义设置</title>
    </head>
    <body>
        <script>
              /*
                    一、定义设置

                            必须在使用之前定义设置。

                            1、如何定义设置？

                                            ABP被设计为模块化，因此不同的模块可以有不同的设置。

                                            模块必须创建一个派生自SettingDefinitionProvider的类才能定义其设置。

                                            一个示例设置定义提供程序如下所示：

                                                    public class EmailSettingProvider : SettingDefinitionProvider // 设置定义提供程序基类
                                                    {
                                                        public override void Define(ISettingDefinitionContext context) // 参数：   设置定义上下文对象
                                                        {
                                                            context.Add(
                                                                new SettingDefinition("Smtp.Host", "127.0.0.1"),  // 参数：   设置定义对象数组
                                                                new SettingDefinition("Smtp.Port", "25"),
                                                                new SettingDefinition("Smtp.UserName"),
                                                                new SettingDefinition("Smtp.Password", isEncrypted: true),
                                                                new SettingDefinition("Smtp.EnableSsl", "false")
                                                            );
                                                        }
                                                    }

                                            如果你正在开发一个DDD模块，你通常会在Domain层中创建这个类，当然，这不是强制性的。

                                            ABP会自动发现此类并注册设置定义。


                            2、用于定义设置的属性：

                                            ①、Name：
                                                        应用程序中设置的唯一名称。
                                                        
                                                        这是唯一的强制属性。
                                                        
                                                        用于在应用程序代码中获取/设置此设置的值（最好为设置名称定义一个const字符串，而不是使用魔术字符串）。

                                            ②、DefaultValue：设置可能具有默认值。

                                            ③、DisplayName：可用于在UI上显示设置名称的可本地化字符串。

                                            ④、Description: 可用于在UI上显示设置描述的可本地化字符串。

                                            ⑤、IsVisibleToClients： 布尔值指示此设置值在客户端是否可用。
                                            
                                                                    默认值为false以防止意外发布内部关键设置值。

                                            ⑥、IsInhered：布尔值指示此设置值是否从其他提供者继承。

                                                        如果未为请求的提供者设置设置值，则默认值为true，并回退到下一个提供者（有关更多信息，请参阅设置值提供者部分）。
                                                        
                                            ⑦、IsEncrypted：  布尔值指示此设置值是否应在保存时加密并在读取时解密。它可以保护数据库中的设置值。

                                            ⑧、Providers：可用于限制可用于特定设置的提供程序（有关详细信息，请参阅设置值提供程序部分）。

                                            ⑨、Properties：用于设置有关此设置的自定义属性的名称/值集合，这些属性可稍后在应用程序代码中使用。


                            3、更改依赖模块的设置定义：

                                            在某些情况下，你可能希望更改在你的应用程序/模块所依赖的其他模块中定义的设置的某些属性。

                                            设置定义提供程序可以查询和更新设置定义。

                                            以下示例获取由 "Volo. Abp.Email" 包定义的设置并更改其属性：

                                                public class MySettingDefinitionProvider : SettingDefinitionProvider
                                                {
                                                    public override void Define(ISettingDefinitionContext context)
                                                    {
                                                        var smtpHost = context.GetOrNull("Abp.Mailing.Smtp.Host");  // 获取现有设置对象（如果有）
                                                        if (smtpHost != null)
                                                        {
                                                            // 修改设置属性
                                                            smtpHost.DefaultValue = "mail.mydomain.com";
                                                            smtpHost.DisplayName = 
                                                                new LocalizableString(
                                                                    typeof(MyLocalizationResource),
                                                                    "SmtpServer_DisplayName"
                                                                );
                                                        }
                                                    }
                                                }

                                            Abp.Mailing.Smtp.Host设置名称是由EmailSettingNames类定义的常量（在Volo.Abp.Emailing命名空间中）。
                */
        </script>
    </body>
</html>